package bitclub;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import persistencia.PCliente;

/**
 * @author BitClub
 */
public class Cliente extends Persona {
    private double saldo;
    private List<Alquiler> listAlquiler;
    private boolean bloqueado;
    private int id;

    //Constructor completo para Cliente (Conocido el ID)
    public Cliente(String nombre, String apellidos, String dni, boolean activo, String mail, String tel_fijo, String tel_movil, String direccion, String codigoPostal, String localidad, Date nacimiento, char sexo, Date fechaAlta, Date fechaBaja, String password, double saldo, List<Alquiler> listAlquiler, boolean bloqueado, int id) {
        super(nombre, apellidos, dni, activo, mail, tel_fijo, tel_movil, direccion, codigoPostal, localidad, nacimiento, sexo, fechaAlta, fechaBaja, password);
        this.saldo = saldo;
        this.listAlquiler = listAlquiler;
        this.bloqueado = bloqueado;
        this.id = id;
    }

    //Constructor sin ID para dar de alta un Cliente
    public Cliente(String nombre, String apellidos, String dni, boolean activo, String mail, String tel_fijo, String tel_movil, String direccion, String codigoPostal, String localidad, Date nacimiento, char sexo, Date fechaAlta, Date fechaBaja, String password, double saldo, List<Alquiler> listAlquiler, boolean bloqueado) {
        super(nombre, apellidos, dni, activo, mail, tel_fijo, tel_movil, direccion, codigoPostal, localidad, nacimiento, sexo, fechaAlta, fechaBaja, password);
        this.saldo = saldo;
        this.listAlquiler = listAlquiler;
        this.bloqueado = bloqueado;
        this.id = -1;
    }

    //Constructor vacío para usar en la capa de persistencia
    public Cliente(){
        super();
    }
    
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public boolean isBloqueado() {
        return bloqueado;
    }

    public List<Alquiler> getListAlquiler() {
        return listAlquiler;
    }

    public double getSaldo() {
        return saldo;
    }

    public void setBloqueado(boolean bloqueado) {
        this.bloqueado = bloqueado;
    }

    public void setListAlquiler(List<Alquiler> listAlquiler) {
        this.listAlquiler = listAlquiler;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    @Override
    public String toString() {
        BitUtil.borra();
        // Presentación de resultados booleanos true and false mejorado
        String resp1 = "";
        String resp2 = "";
        //Si el usuario se encuentra ACTIVO O NO
        if (this.isActivo() == true) {
            resp1 = "ACTIVO";
        }
        if (this.isActivo() == false) {
            resp1 = "NO ACTIVO";
        }
        //Si el usuario se encuentra BLOQUEADO O NO
        if (this.isBloqueado() == true) {
            resp2 = "USUARIO BLOQUEADO";
        }
        if (this.isBloqueado() == false) {
            resp2 = "EL USUARIO SE ENCUENTRA ACTIVADO";
        }
        //Tres variables y tres métodos de la clase BitUtil
        String fecha_Nacimiento, fecha_Alta, fecha_Baja;
        //*****************
        if (this.getNacimiento() == null) {
            fecha_Nacimiento = " ";
        } else {
            fecha_Nacimiento = BitUtil.muestraFecha(this.getNacimiento());
        }
        //*****************
        if (this.getFechaAlta() == null) {
            fecha_Alta = " ";
        } else {
            fecha_Alta = BitUtil.muestraFecha(this.getFechaAlta());
        }
        //*****************
        if (this.getFechaBaja() == null) {
            fecha_Baja = " ";
        } else {
            fecha_Baja = BitUtil.muestraFecha(this.getFechaBaja());
        }

        // Conversión del carácter H&M a texto
        String sexo = "";
        char sex = this.getSexo();
        if (sex == 'h' || sex == 'H') {
            sexo = "Hombre";
        } else if (sex == 'm' || sex == 'M') {
            sexo = "Mujer";
        }
        // En esta variable vamos a concatenar todos los atributos de nuestro Cliente
        String almacena_el_resultado = "";

        almacena_el_resultado += "----- ----- ----- ----- ----- ----- ----- ----- ----- ----- \n";
        almacena_el_resultado += "                    Nombre y apellidos: " + getNombre() + ", " + getApellidos() + "\n";
        almacena_el_resultado += "                    D.N.I.: " + getDni() + "\n";

        if (this.getId() != -1) {
            almacena_el_resultado += "ID: " + this.getId() + "\n";
        }

        almacena_el_resultado += "¿ACTIVO?: " + resp1 + "\n";
        almacena_el_resultado += "SALDO CONTABLE: " + this.getSaldo() + "\n";
        almacena_el_resultado += "¿BLOQUEADO?: " + resp2 + "\n";
        almacena_el_resultado += "E-mail: " + this.getMail() + "\n";
        almacena_el_resultado += "Teléfono fijo: " + this.getTel_fijo() + "\n";
        almacena_el_resultado += "Teléfono movil: " + this.getTel_movil() + "\n";
        almacena_el_resultado += "Domicilio: " + this.getDireccion() + "\n";
        almacena_el_resultado += "C.P.: " + getCodigoPostal() + "\n";
        almacena_el_resultado += "Localidad: " + getLocalidad() + "\n";
        almacena_el_resultado += "Fecha de nacimiento: " + fecha_Nacimiento + "\n";
        almacena_el_resultado += "S e x o: " + sexo + "\n";
        almacena_el_resultado += "Fecha de Alta: " + fecha_Alta + "\n";
        almacena_el_resultado += "Fecha de Baja: " + fecha_Baja + "\n";

        // DEVOLVEMOS LA CADENA COMPLETA
        return almacena_el_resultado;
    }

    /**
     * Crea un nuevo cliente
     */
    public void nuevo() {
        //Petición a la clase de persistencia de cliente
        PCliente.nuevoBD(this);

    }

    /**
     * Actualiza los datos de un cliente
     */
    public void actualizar() {
        //Petición a la clase de persistencia de cliente
        PCliente.actualizarBD(this);
    }

    /**
     * Devuelve una lista de clientes cuyo nombre o apellido coincida con cierto patron
     * @param nombre o apellido
     * @return List<Cliente>
     */
    public static List<Cliente> seleccionarPorNombre(String nombre) {
        List<Cliente> listCliente = new ArrayList();
        //Petición a la clase de persistencia de cliente
        listCliente=PCliente.seleccionarPorNombreBD(nombre);
        return listCliente;
    }

    /**
     * Devuelve el cliente cuyo dni se corresponda con el parámetro
     * @param dni
     * @return Cliente
     */
    public static Cliente seleccionarPorDni(String dni) {
        Cliente cliente;
        //Petición a la clase de persistencia de proveedor
        cliente=PCliente.seleccionarPorDniBD(dni);
        return cliente;
    }

    /**
     * Devuelve el cliente cuyo número de cliente se corresponda con el parámetro
     * @param numCliente Número de cliente
     * @return Cliente
     */
    public static Cliente seleccionarPorNumCliente(int numCliente) {
        Cliente cliente;
        //Petición a la clase de persistencia de proveedor
        cliente=PCliente.seleccionarPorNumClienteBD(numCliente);
        return cliente;
    }
}
